﻿using Engine;
using Game.Server.Event;
using Game.Server.PlayerEvent;
using System.Collections.Generic;
using System.IO;
using System;
using Game.NetWork.Packages;
using Game.NetWork;
using System.Text;
using System.Security.Cryptography;
using LiteNetLib;
using System.Threading.Tasks;
using System.Net;
using _34op;

namespace _34op // 名名空间
{
    public static class PasswordManager // 类名
    {
        private static int attemptCount = 0; // 尝试次数
        private static int maxAttempts = 5;  // 最大尝试次数
        private static TimeSpan lockoutDuration = TimeSpan.FromMinutes(5); // 锁定时间
        private static DateTime lockoutEndTime = DateTime.MinValue;// 锁定结束时间
        private static string correctPassword = null;  // 正确密码
        private static bool canUsePassword = false;  // 是否可以使用密码

        static PasswordManager() // 静态构造函数
        {
            if (!Directory.Exists(Storage.GetSystemPath("app:/PluginData"))) // 创建插件数据目录
            {
                Directory.CreateDirectory(Storage.GetSystemPath("app:/PluginData")); // 创建插件数据目录
            }

            if (!File.Exists(Storage.GetSystemPath("app:/PluginData/opPassWord.txt"))) // 创建密码文件
            {
                using (File.Create(Storage.GetSystemPath("app:/PluginData/opPassWord.txt"))) // 创建空文件
                {
                    
                }
            }

            LoadPasswordFromFile(Storage.GetSystemPath("app:/PluginData/opPassWord.txt")); // 加载密码
        }

        public static int passwordManager(string password) // 密码验证函数
        {
            if (!canUsePassword) // 判断是否可以使用密码
            {
                return 0; // 不可以使用密码
            }

            if (ValidatePassword(password)) // 验证密码
            {
                return 1; // 密码正确
            }
            else //否则
            {
                return 2; //密码错误
            }
        }

        private static bool ValidatePassword(string password) // 密码验证函数
        {
            return password == correctPassword;// 正确密码
        }

        public static void LoadPasswordFromFile(string filePath) // 加载密码文件
        {
            try // 异常处理
            {
                if (!Directory.Exists(Storage.GetSystemPath("app:/PluginData"))) // 判断插件数据目录是否存在
                {
                    Directory.CreateDirectory(Storage.GetSystemPath("app:/PluginData"));// 创建插件数据目录
                }

                if (!File.Exists(filePath)) // 判断密码文件是否存在
                {
                    using (File.Create(filePath)) // 创建空文件
                    {
                        //
                    }
                }

                if (File.Exists(filePath)) // 判断密码文件是否存在
                {
                    string[] lines = File.ReadAllLines(filePath); // 读取所有行
                    if (lines.Length > 0 && !string.IsNullOrEmpty(lines[0])) // 判断是否有密码
                    {
                        correctPassword = lines[0]; // 正确密码
                        canUsePassword = true;  // 允许使用密码
                        Console.WriteLine("Password loaded successfully.");
                    }
                    else //否则
                    {
                        Console.WriteLine("Password file is empty. Password login is disabled.");
                    }
                }
                else         // 密码文件不存在
                {
                    Console.WriteLine("Password file does not exist. Password login is disabled.");
                }
            }
            catch (Exception e) // 异常处理
            {
                Console.WriteLine($"An error occurred while loading the password: {e.Message}");
            }
        }
    }
}

namespace Game.Server.Plugins // 命名空间
{
    /// <summary>
    /// 插件指令
    /// </summary>
    public class OpPlayer : AbstractProcessCmd // 继承AbstractProcessCmd 类
    {
        public override string Cmd => "34op"; //指令名

        public override string Introduce => "/34op -赋予他人管理员权限"; //指令说明

        public override int AuthLevel => 10; //指令权限等级

        public override DisplayType Display => DisplayType.All; //指令是否可查看


        /// <summary>
        /// 指令执行
        /// </summary>
        /// 
        public override void ProcessCmd() // 指令执行函数
        {

            if (GameManager.Project == null)
            {
                SendMessage(Cmd, "请先进入存档");
                return;
            }

            if (m_messageDatas.Length < 2)
            {
                SendMessage(Cmd, "请先输入玩家名");
                return;
            }

            bool findFlag = false; // 玩家是否在线

            SubsystemPlayers subsystemPlayers = GameManager.Project.FindSubsystem<SubsystemPlayers>(); // 获取玩家管理器
            foreach (PlayerData playerData in subsystemPlayers.PlayersData) // 遍历玩家数据
            {
                if (!findFlag) // 玩家是否在线
                {
                    if (playerData.m_name == m_messageDatas[1]) // 玩家名匹配
                    {
                        playerData.ServerManager = true; // 设置管理员权限
                        findFlag = true;  // 玩家在线
                    }
                }
            }

            if (findFlag) // 玩家在线
            {
                SendMessage("34op", "设置管理员成功"); // 发送消息
            }
            else
            {
                SendMessage("34op", "设置未成功，玩家未在线"); // 发送消息
            }
        }
    }

    public class OpPlayerByPwd : AbstractProcessCmd // 继承AbstractProcessCmd 类
    {
        public override string Cmd => "34opByPwd"; //指令名

        public override string Introduce => "/34opByPwd -使用密码获取管理员权限"; //指令说明

        public override int AuthLevel => 0; //指令权限等级

        public override DisplayType Display => DisplayType.All; //指令是否可查看


        /// <summary>
        /// 指令执行
        /// </summary>
        /// 
        public override void ProcessCmd() // 指令执行函数
        {

            if (GameManager.Project == null) // 判断存档是否存在
            {
                SendMessage(Cmd, "请先进入存档"); // 发送消息
                return;
            }
            if (m_messageDatas.Length < 2) // 判断是否输入密码
            {
                SendMessage(Cmd, "请先输入管理员密码"); // 发送消息
                return;
            }

            switch (PasswordManager.passwordManager(m_messageDatas[1])) // 密码验证
            {
                case 0: // 不支持
                    SendMessage("34op", "服务器不支持使用密码获取管理员权限");
                    break;
                case 1: // 密码正确
                    m_client.PlayerData.ServerManager = true;
                    SendMessage("34op", "你已成功获取管理员权限");
                    break;
                case 2: // 密码错误
                    SendMessage("34op", "密码错误，请重试");
                    break;
            }
        }
    }

    public class DeopPlayer : AbstractProcessCmd // 继承AbstractProcessCmd 类
    {
        public override string Cmd => "34deop"; //指令名

        public override string Introduce => "/34deop -撤销他人或自己管理员权限"; //指令说明

        public override int AuthLevel => 10; //指令权限等级

        public override DisplayType Display => DisplayType.All; //指令是否可查看


        /// <summary>
        /// 指令执行
        /// </summary>
        /// 
        public override void ProcessCmd() // 指令执行函数
        {

            if (GameManager.Project == null) // 判断存档是否存在
            {
                SendMessage(Cmd, "请先进入存档"); // 发送消息
                return; // 退出函数
            }

            if (m_messageDatas.Length < 2) // 判断是否输入玩家名
            {
                m_client.PlayerData.ServerManager = false; // 撤销自己的管理员权限
                SendMessage(Cmd, "已撤销自己的管理员权限"); // 发送消息
                return; // 退出函数
            }

            bool findFlag = false; // 玩家是否在线

            SubsystemPlayers subsystemPlayers = GameManager.Project.FindSubsystem<SubsystemPlayers>(); //获取玩家管理器
            foreach (PlayerData playerData in subsystemPlayers.PlayersData) // 遍历玩家数据
            {
                if (!findFlag) // 玩家是否在线
                {
                    if (playerData.m_name == m_messageDatas[1]) // 玩家名匹配
                    {
                        playerData.ServerManager = false; // 撤销管理员权限
                        findFlag = true; // 玩家在线
                    }
                }
            }

            if (findFlag) // 玩家在线
            {
                SendMessage("34op", "设置管理员成功"); // 发送消息
            }
            else // 玩家不在线
            {
                SendMessage("34op", "设置未成功，玩家未在线"); //   发送消息
            }
        }
    }

    /// <summary>
    /// 插件服务
    /// </summary>
    public class BanPlugin : ServerPlugin
    {
        public override int Version => 1; //版本号

        public override string Name => "34op"; //插件名

        public byte FirstLevel => 0; //优先级

        /// <summary>
        /// 加载插件时执行（初始化）
        /// </summary>
        public override void Initialize()
        {

        }

        /// <summary>
        /// 存档加载时执行
        /// </summary>
        public override void Load()
        {

        }

        /// <summary>
        /// 存档保存时执行
        /// </summary>
        public override void Save()
        {

        }
    }
}